import { SupportVideoType, IVideoBase ,VideoDetailInfo,VideoIntroduceInfo} from "./icommon/index";

// icommon defines a global namespace `ICommon`, so use the global types instead of importing as a module.
type IPlugin = any;
export enum PluginState {
    // 加载中
    Loading,
    // 已加载
    Mounted,
    // 出现错误
    Error
}

export enum PluginErrorReason {
    // 版本不匹配
    VersionNotMatch,
    // 无法解析
    CannotParse,
}
/**
 * 插件安装配置接口
 */
export interface IInstallPluginConfig {
    notCheckVersion?: boolean;
}

/**
 * 插件安装结果接口
 */
export interface IInstallPluginResult {
    success: boolean;
    message?: string;
    pluginName?: string;
    pluginHash?: string;
    pluginUrl?: string;
}

/**
 * 搜索结果接口
 */
export interface ISearchResult<T extends SupportVideoType> {
    isEnd?: boolean;
    data: IVideoBase[T][];
}

/**
 * 搜索函数接口
 */
type ISearchFunc = <T extends SupportVideoType>(
    query: string,
    page: number,
    type: T,
) => Promise<ISearchResult<T>>;

/**
 * 获取视频介绍函数接口
 */
type IFetchIntroduceInfoFunc = (
  params: {
    url: string
    id: string
  }
) => Promise<VideoIntroduceInfo>;


/**获取视频详情函数接口 */
type IFetchVideoDetailInfoFunc = (
  params: {
    url: string
    id: string,
    source?: number,
    episodeIndex?: number
  }
) => Promise<VideoDetailInfo>;


export interface IPluginDefine {
     /** 来源名 */
    label: string; 
    /** 来源名 */
    platform: string;
    /** 匹配的版本号 */
    appVersion?: string;
    /** 插件版本 */
    version?: string;
    /** 远程更新的url */
    srcUrl?: string;
    /** 插件作者 */
    author?: string;
    /** 插件描述，支持markdown */
    description?: string;
    /** 插件是否启用搜索功能 */
    enabledSearch?: boolean;
    /** 搜索 */
    search?: ISearchFunc;
    /** 获取视频介绍 */
    fetchIntroduceInfo?: IFetchIntroduceInfoFunc;
    /** 获取视频详情 */
    fetchVideoDetailInfo?: IFetchVideoDetailInfoFunc;

}

export interface IPluginInstance extends IPluginDefine {
    /** 内部属性 */
    /** 插件路径 */
    _path: string;
}

export interface IPluginManager {
    /**
     * 初始化插件管理器，从文件系统加载所有插件
     * 读取插件目录中的所有.js文件并创建插件实例
     * @throws 如果插件初始化失败则抛出异常
     */
    setup(): Promise<void>;
    /**
* 从本地文件安装插件
* @param pluginPath - 插件文件路径
* @param config - 安装配置选项
* @param config.notCheckVersion - 为true时跳过版本检查
* @param config.useExpoFs - 为true时使用Expo文件系统代替React Native的文件系统
* @returns 安装结果，包含成功状态和相关信息
*/
    installPluginFromLocalFile(
        pluginPath: string,
        config?: IInstallPluginConfig & {
            useExpoFs?: boolean
        },
    ): Promise<IInstallPluginResult>
    /**
 * 从URL安装插件
 * @param url - 下载插件的URL
 * @param config - 安装配置选项
 * @param config.notCheckVersion - 为true时跳过版本检查
 * @returns 安装结果，包含成功状态和相关信息
 */
    installPluginFromUrl(
        url: string,
        config?: IInstallPluginConfig,
    ): Promise<IInstallPluginResult>;


    /**
     * 使用插件的源URL更新插件
     * @param plugin - 要更新的插件实例
     * @throws 如果插件没有源URL或更新失败时抛出错误
     */
    updatePlugin(plugin: IPlugin): Promise<void>;
}


 type R = Required<IPluginInstance>;

   export type IPluginInstanceMethods = {
        [K in keyof R as R[K] extends (...args: any) => any ? K : never]: R[K];
    };